import java.util.*;


public class Permutation {
    /**
     * 输入一个长度为 n 字符串，打印出该字符串中字符的所有排列，你可以以任意顺序返回这个字符串数组。
        例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。
        时间复杂度O(n!)
        注意：不能重复，比如["aa"],只能输出["aa"],所以用Set来去重
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return string字符串ArrayList
     */
    public ArrayList<String> Permutation(String str) {
        if (str.length() == 0) {
            return new ArrayList<>();
        }
        Set<String> result = new HashSet<>();
        dfs("", str, result);
        return new ArrayList<>(result);
    }

    private void dfs(String prefix, String remain, Set<String> result) {
        if (remain.length() == 0) {
            result.add(prefix);
            return;
        }
        for (int i = 0; i < remain.length(); i++) {
            // 选择当前字符加入到排列中
            String newPrefix = prefix + remain.charAt(i);// 加入当前字符
            String newRemain = remain.substring(0, i) + remain.substring(i + 1);// 去掉当前字符
            dfs(newPrefix, newRemain, result);
        }
    }
}